package 螺旋矩阵II;

import java.sql.Clob;
import java.util.ArrayList;
import java.util.List;

public class Matrix02 {
    public static void main(String[] args) {

        /*
        给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。
         */
        int[][] a = {
                {1},
                {2},
                {3},
                {4}
        };
        List<Integer> result = spiralOrder(a);
        System.out.println(result);
    }

    public static List<Integer> spiralOrder(int[][] matrix) {
        // 本题不考察算法，还是对代码的掌握能力，对边界的控制
        // 如果是方阵的话要《切记左闭右开原则》
        // 不规则的螺旋矩阵我们可以设置两端终止的点，不断的从两端缩小矩阵,仍然要注意矩阵的边界控制

        List<Integer> list = new ArrayList<>();

        // 行的开始端点
        int rowBegin = 0;
        // 行的结束端点
        int rowEnd = matrix.length - 1;
        // 列的开始端点
        int colBegin = 0;
        // 列的结束端点
        int colEnd = matrix[0].length - 1;

        // 只要任意一个条件不满足，就说明已经遍历了所有的行或者所有的列 --> 那就说明矩阵遍历结束
        while(rowBegin<=rowEnd && colBegin<= colEnd){
            // 向右遍历，注意左列和右列的边界值，遍历结束需要更新行的开始端点(将一行所有未遍历的元素都遍历了)
            for(int i=colBegin; i<=colEnd; i++)
                list.add(matrix[rowBegin][i]);
            rowBegin++; // 遍历了上行，就需要增加rowBegin缩小未遍历的范围

            // 向下遍历，需要注意行的开始和结束边界值，因为上一个for循环中已经处理了最右边的元素且进行了rowBegin++
            // 所以我们仍然可以从rowBegin作为新的行开始点，遍历到rowEnd结束点
            for(int i=rowBegin; i<=rowEnd; i++)
                list.add(matrix[i][colEnd]);
            colEnd--;   // 遍历了右列，就需要减小colEnd缩小未遍历的范围

            // 向左遍历，需要注意列的结束点和开始点，并且明确目前遍历的是哪一行(rowEnd)
            // 此时会出现一个问题：在第一个for循环中，行就已经可能已经遍历结束了，所以我们需要判断是否还存在未遍历的行
            if (rowBegin > rowEnd)
                break;
            for(int i=colEnd; i>=colBegin; i--)
                list.add(matrix[rowEnd][i]);
            rowEnd--;   // 遍历了下行，就需要减少rowEnd缩小未遍历的范围

            // 向上遍历，需要注意行的结束点和开始点，并且明确目前遍历的是哪一列(colBegin)
            // 此时会出现一个问题：在第二个for循环中，列就已经可能已经遍历结束了，所以我们需要判断是否还存在未遍历的列
            if( colBegin > colEnd )
                break;
            for(int i=rowEnd; i>=rowBegin; i--)
                list.add(matrix[i][colBegin]);
            colBegin++; // 遍历了左列，就需要增加colBegin缩小未遍历的范围
        }
        return list;
    }

}
